kubeadm部署kubernetes高可用

您所在的位置:网站首页 kubeadm 高可用 kubeadm部署kubernetes高可用

kubeadm部署kubernetes高可用

2023-07-29 13:52| 来源: 网络整理| 查看: 265

一、 1.准备 准备6台机器,操作系统CentOS Linux release 7.9.2009 (Core) 硬件配置:16C 32G 硬盘1.6T 集群中所有机器之间网络互通,且可访问外网。 注意:选择对应的kubeadm kubectl kubelet 和对应的docker版本 选择kubeadm-1.20.6 kubectl-1.20.6 kubelet-1.20.6 docker-19.03.14 节点名称IPmaster1192.168.81.21master2192.168.81.22master3192.168.81.23node1192.168.81.24node2192.168.81.25node3192.168.81.26 2.1安装前预处理操作 (1)更改节点名称 hostnamectl set-hostname (2)添加hosts解析 cat >>/etc/hosts < 192.168.81.21 master1 192.168.81.22 master2 192.168.81.23 master3 192.168.81.24 node1 192.168.81.25 node2 192.168.81.26 node3 EOF 注:所有节点都要添加host解析记录 (3)配置免密 在master1节点生成密钥对,并分发给其他的所有主机。 ssh-keygen [root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master1 [root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master2 [root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master3 [root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1 [root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2 [root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node3 (4)升级内核 通过下载kernel image的rpm包进行安装。 centos7系统:http://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 编写shell脚本升级内核 #!/bin/bash # ---------------------------- # upgrade kernel by [email protected] # ---------------------------- yum localinstall -y kernel-lt* if [ $? -eq 0 ];then grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)" fi echo "please reboot your system quick!!!" 注意:一定要重启机器 [root@master1 ~]# uname -r 4.4.229-1.el7.elrepo.x86_64

img

(5)关闭防火墙selinux systemctl disable --now firewalld setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config (6)关闭swap分区 swapoff -a sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab 第一条是临时关闭,当然也可以使用第二条永久关闭,后者手动在/etc/fstab文件中将swap挂载所在的行注释掉即可。 (7)优化内核 cat > /etc/sysctl.d/k8s.conf /etc/sysctl.d/k8s.conf /etc/docker/daemon.json /etc/yum.repos.d/kubernetes.repo > ~/.bashrc < export KUBECONFIG=/etc/kubernetes/admin.conf EOF [root@master1 ~]# source ~/.bashrc

好了,此时的master1节点就算是初始化完毕了。

有个重要的点就是最后几行信息中,其中有两条kubeadm join 192.168.81.100:8443 开头的信息。这分别是其他master节点和node节点加入kubernetes集群的认证命令。这个密钥是系统根据 sha256算法计算出来的,必须持有这样的密钥才可以加入当前的kubernetes集群。

使用区别

这两条加入集群的命令是有一些区别的:

比如这个第一条,我们看到最后有一行内容--control-plane --certificate-key xxxx,这是控制节点加入集群的命令,控制节点是kubernetes官方的说法,其实在我们这里指的就是其他的master节点。

查看节点

如果此时查看当前集群的节点,会发现只有master1节点自己。

[root@master1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION master1 NotReady master 9m58s v1.20.6 2.6、其他master节点加入kubernetes集群中 (1)master2节点加入集群

既然是其他的master节点加入集群,那肯定是使用如下命令:

[root@master2 ~]# kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0 \ --control-plane --certificate-key 618ddae0fd9e026bdcb50c7be068665402f8277d12bbbbd5850ef7d4bd5b025b

再执行一些收尾工作

[root@master2 ~]# mkdir -p $HOME/.kube [root@master2 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master2 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

加环境变量

[root@master2 ~]# cat >> ~/.bashrc < export KUBECONFIG=/etc/kubernetes/admin.conf EOF [root@master2 ~]# source ~/.bashrc (2)master3节点加入集群 [root@master3 ~]# kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0 \ --control-plane --certificate-key 618ddae0fd9e026bdcb50c7be068665402f8277d12bbbbd5850ef7d4bd5b025b

再执行一些收尾工作

[root@master3 ~]# mkdir -p $HOME/.kube [root@master3 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master3 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

加环境变量

[root@master3 ~]# cat >> ~/.bashrc < export KUBECONFIG=/etc/kubernetes/admin.conf EOF [root@master3 ~]# source ~/.bashrc

到此,所有的master节点都已经加入集群

查看集群master节点 [root@master1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION master1 NotReady master 25m v1.20.6 master2 NotReady master 12m v1.20.6 master3 NotReady master 3m30s v1.20.6

你可以在任意一个master节点上执行kubectl get node查看集群节点的命令。

2.7、node节点加入kubernetes集群中

正如我们上面所说的,master1节点初始化完成后,第二条kubeadm join xxx(或者说是最后一行内容)内容便是node节点加入集群的命令。

kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0

注意:node节点加入集群只需要执行上面的一条命令即可,只要没有报错就表示成功。不必像master一样做最后的加入环境变量等收尾工作。

(1)node1节点加入集群 [root@node1 ~]# kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0 [preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ [preflight] Reading configuration from the cluster... .... .... [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

当看到倒数第四行内容This node has joined the cluster,这一行信息表示node1节点加入集群成功。

三个node节点分别执行

(3)查看集群节点信息 [root@master1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION master1 NotReady control-plane,master 20d v1.20.6 master2 NotReady control-plane,master 20d v1.20.6 master3 NotReady control-plane,master 20d v1.20.6 node1 NotReady 20d v1.20.6 node2 NotReady 20d v1.20.6 node3 NotReady 20d v1.20.6

可以看到集群的五个节点都已经存在,但是现在还不能用,也就是说现在集群节点是不可用的,原因在于上面的第2个字段,我们看到五个节点都是``NotReady`状态,这是因为我们还没有安装网络插件。

网络插件有calico,flannel等插件,这里我们选择使用flannel插件。

2.8、安装网络插件

默认大家从网上看的教程都会使用这个命令来初始化。

[root@master1 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

事实上很多用户都不能成功,因为国内网络受限,所以可以这样子来做。

(2)更换flannel镜像源

master1节点上修改本地的hosts文件添加如下内容以便解析

199.232.28.133 raw.githubusercontent.com

然后下载flannel文件

[root@master1 ~]# curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

编辑镜像源,默认的镜像地址我们修改一下。把yaml文件中所有的quay.io修改为 quay-mirror.qiniu.com

[root@master1 ~]# sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml

此时保存保存退出。在master节点执行此命令。

[root@master1 ~]# kubectl apply -f kube-flannel.yml podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds-amd64 created daemonset.apps/kube-flannel-ds-arm64 created daemonset.apps/kube-flannel-ds-arm created daemonset.apps/kube-flannel-ds-ppc64le created daemonset.apps/kube-flannel-ds-s390x created

这样子就可以成功拉取flannel镜像了。当然你也可以使用我提供给大家的kube-flannel.yml文件

查看flannel是否正常

如果你想查看flannel这些pod运行是否正常,使用如下命令

[root@master1 ~]# kubectl get pods -n kube-system | grep flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-amd64-dp972 1/1 Running 0 66s kube-flannel-ds-amd64-lkspx 1/1 Running 0 66s kube-flannel-ds-amd64-rmsdk 1/1 Running 0 66s kube-flannel-ds-amd64-wp668 1/1 Running 0 66s kube-flannel-ds-amd64-zkrwh 1/1 Running 0 66s

如果第三字段STATUS不是处于Running状态的话,说明flannel是异常的,需要排查问题所在。

查看节点是否为Ready

稍等片刻,执行如下指令查看节点是否可用

[root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 21h v1.18.4 master2 Ready master 21h v1.18.4 master3 Ready master 21h v1.18.4 node1 Ready 62m v1.18.4 node2 Ready 62m v1.18.4

目前节点状态是Ready,表示集群节点现在是可用的。

2.9、安装dashboard (1)创建dashboard 未经改动的 kubernetes-dashboard.yaml 部分细节 kubernetes-dashboard Deployment 处的 tolerations 配置

img

dashboard-tolerations.png

​ 如果不接受将 dashboard 部署在 master 节点,就可以将下面的配置注释掉。但事实上不注释上面的内容,Kubernetes 也不会将 dashboard 部署在 master 节点上。

​ 由于 pod 不会分配到到 master 节点, 并且 kubeadm部署的 apiserver 中启用的验证方式为 Node 和 RBAC, 且关闭了 insecure-port, 猜测可能是这个原因导致连接不上 apiServer , 即使是手动修改也不行 --apiserver-host 参数也不行。

个人的一个解决方案 将 kubernetes-dashboard 部署在 master 节点上,修改的配置文件内容如下:

在这里插入图片描述

dashboard-metrics.png

在这里插入图片描述

dashboard.png

​ 上述配置将指定 kubernetes-dashboard 和 kubernetes-metrics-scraper 分配部署的节点,此处选择部署在 master 节点解决文中出现的通信问题。

其他配置 在这里插入图片描述

dashboard-nodeport.png

​ 指定 Service 通过 Cluster 节点的静态端口对外提供服务。Cluster 外部可以通过 : 访问 Service。

获取token值

[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

把上面的token值输入进去即可进去dashboard界面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwhej9Gc-1654745144610)(C:\Users\zhou\AppData\Roaming\Typora\typora-user-images\image-20220609111836995.png)]

不过现在我们虽然可以登陆上去,但是我们权限不够还查看不了集群信息,因为我们还没有绑定集群角色,可以先按照上面的尝试一下,再来做下面的步骤

(2)cluster-admin管理员角色绑定 [root@master1 ~]# kubectl create serviceaccount dashboard-admin -n kube-system [root@master1 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin [root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3